# 对于面向对象的继承来说，其实就是将多个类共有的方法提取到父类中，子类仅需继承父类而不必一一实现每个方法

# 在定义子类时要继承父类，只需要类名后面的小括号()中写上父类的名字，那么父类的属性、方法，会被继承给子类。
class Animals:
    def eat(self):
        print("我在吃东西")
        pass
    def drink(self):
        print("我在吃东西")
        pass
    pass
class Dog(Animals):
    def wangwangjiao(self):
        print("我会汪汪叫")
    pass
class Cat(Animals):
    def miaomiaojiao(self):
        print("我会喵喵叫")
    pass
hsq=Dog()
hsq.eat()
hsq.drink()
hsq.wangwangjiao()

bsm=Cat()
bsm.eat()
bsm.drink()
bsm.miaomiaojiao()

##########################多继承########################################
# 在python中支持多继承。多继承是，在当前类的括号里面，写上要继承的父类的名字，多个父类之间用逗号隔开
class BaseA:
    def test(self):
        print("我是Base类中的test方法")
        pass

    pass
class A(BaseA):
    def test(self):
        print("我是A类中的test方法, 我继承自BaseA")
        pass
    pass
class BaseB:
    def test(self):
        print("我是BaseB类中的test方法")
        pass

    pass
class B(BaseB):
    def test(self):
        print("我是B类中的test方法，我继承自BaseB")
        pass
    pass
class C(A,B):
    def test(self):
        print("我是C类中的test方法，我继承自A、B")
        pass
    pass
    pass
c=C()
c.test()
# __mro__ 方法解析顺序
# 方法的执行顺序可以用mro查看。前面代码查找顺序为 C->A->Base->B>Base1,
# 一旦找到，则寻找过程立即中断，便不会再继续找了
print(C.__mro__)


# 继承的传递
# 类的传递过程中，我们把父类又称为基类，子类又称为派生类，父类的属性和方法可以一级一级的传递到子类
class GrandFather:
    def eat(self):
        print("吃饭")
        pass
    pass
class Father(GrandFather):
    pass
class Son(Father):
    pass
son=Son()
son.eat()